package com.szl.minio.service;

import com.szl.minio.config.MinioConfigurationProperties;
import com.szl.minio.utils.MinioUtil;
import io.minio.MinioClient;
import io.minio.StatObjectResponse;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.util.List;

@Service
public class MinioService {
    @Autowired
    private MinioConfigurationProperties minioProperties;

    @Autowired
    private MinioUtil minioUtil;

    /**
     * 获取文件列表
     * @return 文件列表
     */
    public List<String> listFiles() throws MinioException {
        try {
            return minioUtil.listObjectNames(minioProperties.getBucket());
        } catch (Exception e) {
            throw new MinioException("文件服务异常");
        }

    }

    /**
     * 获取文件输入流
     * @param filePath 文件在bucket中的相对路径
     * @return 文件输入流
     */
    public InputStream getFile(String filePath) throws MinioException {
        try {
            return minioUtil.getObjectAsStream(minioProperties.getBucket(),filePath);
        } catch (Exception e) {
            throw new MinioException("文件服务异常");
        }
    }

    /**
     * 获取文件参数
     * @param filePath 文件在bucket中的相对路径
     * @return 文件参数
     */
    public StatObjectResponse getFileStat(String filePath) throws MinioException {
        try {
            return minioUtil.getFileStat(filePath,minioProperties.getBucket());
        } catch (Exception e) {
            throw new MinioException("文件服务异常");
        }
    }

    /**
     * 上传文件
     * @param inputStream 文件输入流
     * @param filePath 文件在bucket中的相对路径
     * @param contentType 文件mime类型
     */
    public void uploadFile(InputStream inputStream, String filePath, String contentType) throws MinioException {

        try {
            minioUtil.uploadObject(minioProperties.getBucket(),filePath,inputStream,contentType);
        } catch (Exception e) {
            throw new MinioException("文件服务异常");
        }
    }

    /**
     * 删除文件
     * @param filePath 文件在bucket中的相对路径
     */
    public void deleteFile(String filePath) throws MinioException {
        try {
            minioUtil.removeObject(minioProperties.getBucket(),filePath);
        } catch (Exception e) {
            throw new MinioException("文件服务异常");
        }
    }

    /**
     * 获取文件临时url
     * @param filePath 文件在bucket中的相对路径
     * @return 文件临时url
     */
    public String getFileTempUrl(String filePath) throws MinioException {

        try {
            return minioUtil.getFileTempUrl(filePath);
        } catch (Exception e) {
            throw new MinioException("文件服务异常");
        }
    }
}
